package nsu.edu.zsq.controller.sys;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletResponse;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;

import com.github.pagehelper.PageInfo;

import nsu.edu.zsq.bean.SchClass;
import nsu.edu.zsq.bean.SchMajor;
import nsu.edu.zsq.bean.Student;
import nsu.edu.zsq.common.JsonData;
import nsu.edu.zsq.exception.ParamException;
import nsu.edu.zsq.param.PageQuery;
import nsu.edu.zsq.service.sys.CourseService;
import nsu.edu.zsq.service.sys.SchClassService;
import nsu.edu.zsq.service.sys.SchMajorService;
import nsu.edu.zsq.util.UploadFileUtil;

/** 
* Description: 学校班级的controller类<br>
*/
@RequestMapping("/sys/class/as")
@Controller
public class SchClassController {
    
    @Autowired
    private SchClassService schClassService;
    @Autowired
    private CourseService courseService;
    @Autowired
    private SchMajorService schMajorService;
    
    /**
     * 获取院系+专业的tree结构数据
     * @return JsonData
     */
    @RequestMapping("/schOrgWithMajorTree")
    @ResponseBody
    public JsonData schOrgWithMajorTree() {
        String listSchOrgWithMajorTree = courseService.listSchOrgWithMajorTree();
        List<SchMajor> listSchMajor = schMajorService.listSchMajor();
        Map<String, Object> map = new HashMap<String, Object>(2);
        map.put("listSchOrgWithMajorTree", listSchOrgWithMajorTree);
        map.put("listSchMajor", listSchMajor);
        return JsonData.success(map);
    }
    
    /**
     * 根据专业代码获取班级的分页数据
     * @param majorNo 专业代码
     * @param pageQuery 分页数据
     * @return JsonData
     */
    @RequestMapping("/listSchClass")
    @ResponseBody
    public JsonData listSchClassWithPage(@RequestParam("majorNo") String majorNo, PageQuery pageQuery) {
        PageInfo<SchClass> listSch = schClassService.listSchClassWithPageByMajorNo(majorNo, pageQuery);
        return JsonData.success(listSch);
    }
      
    /**
     * 添加一条班级信息
     * @param schClass 班级信息
     * @return JsonData
     */
    @RequestMapping("/saveSchClass")
    @ResponseBody
    public JsonData saveSchClass(SchClass schClass) {
        schClassService.saveSchClass(schClass);
        return JsonData.success();
    }
    
    /**
     * 单个或批量删除班级
     * @param classId 班级id
     * @return JsonData
     */
    @RequestMapping("/delSchClass")
    @ResponseBody
    public JsonData deleteSchClass(@RequestParam("classId[]")int[] classId) {
        if (classId.length > 1) {
            // 批量删除
            schClassService.deleteBatchSchClass(classId);
        } else if (classId.length == 1) {
            // 单个删除
            schClassService.deleteSchClass(classId[0]);
        } else {
            throw new ParamException("classId无参数");
        }
        return JsonData.success();
    }
    
    /**
     * 更新一条班级信息
     * @param schClass 班级信息
     * @return JsonData
     */
    @RequestMapping("/updateSchClass")
    @ResponseBody
    public JsonData updateSchClass(SchClass schClass) {
        schClassService.updateSchClass(schClass);
        return JsonData.success();
    }
    
    /**
     * 跳转到班级管理页面
     * @param majorNo 专业代码
     * @param classId 班级id
     * @param model
     * @return String manager/class/as_class_manager.html
     */
    @RequestMapping("/toAsClassManager")
    public String toAsClassManager(@RequestParam("majorNo")String majorNo,@RequestParam("classId")int classId, Model model) {
        model.addAttribute("majorNo", majorNo);
        model.addAttribute("classId", classId);
        return "manager/class/as_class_manager.html";
    }
    
    /**
     * 跳转到班级管理-添加学生页面
     * @param majorNo 专业代码
     * @param classId 班级id
     * @param model
     * @return String manager/class/as_class_addStu.html
     */
    @RequestMapping("/toAsClassAddStu")
    public String toAsClassAddStu(@RequestParam("majorNo")String majorNo,@RequestParam("classId")int classId, Model model) {
        model.addAttribute("majorNo", majorNo);
        model.addAttribute("classId", classId);
        return "manager/class/as_class_addStu.html";
    }
    
    
    // =======================行政班级-班级管理=============================
     
    /**
     * 根据专业代码获取所有没有班级的学生列表（用于班级管理-添加学生页面）
     * @param majorNo 专业代码
     * @param pageQuery 分页数据
     * @return JsonData
     */
    @RequestMapping("/listStudentByMajorNo")
    @ResponseBody
    public JsonData listStudentByMajorNo(@RequestParam("majorNo")String majorNo, PageQuery pageQuery) {
        // 单独设置页面列表数量
        pageQuery.setPageSize(10);
        PageInfo<Student> listStudent = schClassService.listStudentByMajorNoWithPage(majorNo, pageQuery);
        return JsonData.success(listStudent);
    }
    
    /**
     * 根据班级id获取所有没有班级的学生列表（用于班级管理页面）
     * @param classId 班级id
     * @param pageQuery 分页数据
     * @return JsonData
     */
    @RequestMapping("/listStudentByClassId")
    @ResponseBody
    public JsonData listStudentByClassId(@RequestParam("classId")int classId, PageQuery pageQuery) {
        // 单独设置页面列表数量
        pageQuery.setPageSize(10);
        PageInfo<Student> listStudent = schClassService.listStudentByClassIdWithPage(classId, pageQuery);
        return JsonData.success(listStudent);
    }
    
    /**
     * 单个或者批量为学生添加班级
     * @param stuId 学生id
     * @param classId 班级id
     * @return JsonData
     */
    @RequestMapping("/addStuToClass")
    @ResponseBody
    public JsonData addStuToClass(@RequestParam("stuId[]")int stuId[], @RequestParam("classId")int classId) {
        if (stuId.length > 1) {
            // 批量添加
            schClassService.addBatchStuToClass(stuId, classId);
        } else if (stuId.length == 1) {
            // 单个添加
            schClassService.addStuToClass(stuId[0], classId);
        } else {
            throw new ParamException("stuId无参数");
        }
        return JsonData.success();
    }
    
    /**
     * 单个或者批量将学生移除班级
     * @param stuId 学生id
     * @return JsonData
     */
    @RequestMapping("/delStuFromClass")
    @ResponseBody
    public JsonData delStuFromClass(@RequestParam("stuId[]")int stuId[]) {
        if (stuId.length > 1) {
            // 批量移除
            schClassService.deleteBatchFromClass(stuId);
        } else if (stuId.length == 1) {
            // 单个移除
            schClassService.deleteStuFromClass(stuId[0]);
        } else {
            throw new ParamException("stuId无参数");
        }
        return JsonData.success();
    }
    
    
    
    
    /**
     * 从excel文件导入班级信息
     * @param excelFile 上传的excel文件
     * @return JsonData
     */
    @RequestMapping("/importSchClass")
    @ResponseBody
    public JsonData importSchClass(@RequestParam("excelFile")MultipartFile excelFile) {
        // 1.解析excel文件，保存到数据库
        schClassService.importSchClassFromExcel(excelFile);
        // 2.启动多线程保存文件（先保存文件会破坏MultipartFile数据）
        new Thread() {
            public void run() {
                UploadFileUtil.uploadFile(excelFile);
            }
        }.start();
        return JsonData.success();
    }
    
    /**
     * 导出班级信息到excel文件
     * @param response
     */
    @RequestMapping("/exportSchClass")
    public void exportSchClass(HttpServletResponse response) {
        schClassService.exportSchClassToExcel(response);
        
    }
    /**
     * 从excel中导入班级和学生的关联
     * @param excelFile
     * @return JsonData
     */
    @RequestMapping("/importStuToClass")
    @ResponseBody
    public JsonData importStuToClass(@RequestParam("excelFile")MultipartFile excelFile) {
        // 1.解析excel文件，保存到数据库
        schClassService.exportStuToClass(excelFile);
        // 2.启动多线程保存文件（先保存文件会破坏MultipartFile数据）
        new Thread() {
            public void run() {
                UploadFileUtil.uploadFile(excelFile);
            }
        }.start();

        return JsonData.success();
    }
}
